package org.rui;

/**
 * @author: linweirui
 * @date: 2024/12/02 10:54
 */

import lombok.extern.slf4j.Slf4j;
import org.rui.rpc.config.RegistryConfig;
import org.rui.rpc.config.RpcConfig;
import org.rui.rpc.constant.RpcConstant;
import org.rui.rpc.registry.Registry;
import org.rui.rpc.registry.RegistryFactory;
import org.rui.rpc.util.ConfigUtils;

/**
 *
 */
@Slf4j
public class RpcApplication {
    private static volatile RpcConfig rpcConfig;

    /**
     * 框架初始化，可以传入自定义的配置文件
     *
     * @param newConfig
     */
    public static void init(RpcConfig newConfig) {
        rpcConfig = newConfig;
        log.info("rpc init, config = {}", newConfig.toString());
        //注册中心初始化
        RegistryConfig registryConfig = rpcConfig.getRegistryConfig();
        //获取注册中心类别，如etcd
        Registry registry = RegistryFactory.getInstance(registryConfig.getRegistry());
        registry.init(registryConfig);
        log.info("registry init....{}",registryConfig);
        // 创建并注册 Shutdown Hook，JVM 退出时执行服务下线销毁节点信息操作
        Runtime.getRuntime().addShutdownHook(new Thread(registry::destroy));
    }

    /**
     * 初始化配置，如果加载定义配置文件如rpc前缀失败，则加载默认配置文件
     */
    public static void init() {
        RpcConfig newConfig;
        try {
            //加载配置文件
            newConfig = ConfigUtils.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
        } catch (Exception e) {
            //加载配置文件失败就加载默认配置
            newConfig = new RpcConfig();
        }
        init(newConfig);
    }

    /**
     * 获取rpc配置 懒惰加载单例模式
     *
     * @return
     */
    public static RpcConfig getRpcConfig() {
        if (rpcConfig == null) {
            synchronized (RpcApplication.class) {
                if (rpcConfig == null) {
                    init();
                }
            }
        }
        return rpcConfig;
    }

}